<!-- HTML header for doxygen 1.8.6-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<title>OpenCV: Adding borders to your images</title>
<link href="../../opencv.ico" rel="shortcut icon" type="image/x-icon" />
<link href="../../tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="../../jquery.js"></script>
<script type="text/javascript" src="../../dynsections.js"></script>
<script type="text/javascript" src="../../tutorial-utils.js"></script>
<link href="../../search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="../../search/searchdata.js"></script>
<script type="text/javascript" src="../../search/search.js"></script>
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    extensions: ["tex2jax.js", "TeX/AMSmath.js", "TeX/AMSsymbols.js"],
    jax: ["input/TeX","output/HTML-CSS"],
});
//<![CDATA[
MathJax.Hub.Config(
{
  TeX: {
      Macros: {
          matTT: [ "\\[ \\left|\\begin{array}{ccc} #1 & #2 & #3\\\\ #4 & #5 & #6\\\\ #7 & #8 & #9 \\end{array}\\right| \\]", 9],
          fork: ["\\left\\{ \\begin{array}{l l} #1 & \\mbox{#2}\\\\ #3 & \\mbox{#4}\\\\ \\end{array} \\right.", 4],
          forkthree: ["\\left\\{ \\begin{array}{l l} #1 & \\mbox{#2}\\\\ #3 & \\mbox{#4}\\\\ #5 & \\mbox{#6}\\\\ \\end{array} \\right.", 6],
          forkfour: ["\\left\\{ \\begin{array}{l l} #1 & \\mbox{#2}\\\\ #3 & \\mbox{#4}\\\\ #5 & \\mbox{#6}\\\\ #7 & \\mbox{#8}\\\\ \\end{array} \\right.", 8],
          vecthree: ["\\begin{bmatrix} #1\\\\ #2\\\\ #3 \\end{bmatrix}", 3],
          vecthreethree: ["\\begin{bmatrix} #1 & #2 & #3\\\\ #4 & #5 & #6\\\\ #7 & #8 & #9 \\end{bmatrix}", 9],
          cameramatrix: ["#1 = \\begin{bmatrix} f_x & 0 & c_x\\\\ 0 & f_y & c_y\\\\ 0 & 0 & 1 \\end{bmatrix}", 1],
          distcoeffs: ["(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6 [, s_1, s_2, s_3, s_4[, \\tau_x, \\tau_y]]]]) \\text{ of 4, 5, 8, 12 or 14 elements}"],
          distcoeffsfisheye: ["(k_1, k_2, k_3, k_4)"],
          hdotsfor: ["\\dots", 1],
          mathbbm: ["\\mathbb{#1}", 1],
          bordermatrix: ["\\matrix{#1}", 1]
      }
  }
}
);
//]]>
</script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js"></script>
<link href="../../doxygen.css" rel="stylesheet" type="text/css" />
<link href="../../stylesheet.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<!--#include virtual="/google-search.html"-->
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectlogo"><img alt="Logo" src="../../opencv-logo-small.png"/></td>
  <td style="padding-left: 0.5em;">
   <div id="projectname">OpenCV
   &#160;<span id="projectnumber">4.5.2</span>
   </div>
   <div id="projectbrief">Open Source Computer Vision</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
</script>
<script type="text/javascript" src="../../menudata.js"></script>
<script type="text/javascript" src="../../menu.js"></script>
<script type="text/javascript">
$(function() {
  initMenu('../../',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="../../d9/df8/tutorial_root.html">OpenCV Tutorials</a></li><li class="navelem"><a class="el" href="../../d7/da8/tutorial_table_of_content_imgproc.html">Image Processing (imgproc module)</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">Adding borders to your images </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p><b>Prev Tutorial:</b> <a class="el" href="../../d4/dbd/tutorial_filter_2d.html">Making your own linear filters!</a></p>
<p><b>Next Tutorial:</b> <a class="el" href="../../d2/d2c/tutorial_sobel_derivatives.html">Sobel Derivatives</a></p>
<table class="doxtable">
<tr>
<th align="right"></th><th align="left"></th></tr>
<tr>
<td align="right">Original author </td><td align="left">Ana Huamán </td></tr>
<tr>
<td align="right">Compatibility </td><td align="left">OpenCV &gt;= 3.0 </td></tr>
</table>
<h2>Goal </h2>
<p>In this tutorial you will learn how to:</p>
<ul>
<li>Use the OpenCV function <b><a class="el" href="../../d2/de8/group__core__array.html#ga2ac1049c2c3dd25c2b41bffe17658a36" title="Forms a border around an image. ">copyMakeBorder()</a></b> to set the borders (extra padding to your image).</li>
</ul>
<h2>Theory </h2>
<dl class="section note"><dt>Note</dt><dd>The explanation below belongs to the book <b>Learning OpenCV</b> by Bradski and Kaehler.</dd></dl>
<ol type="1">
<li>In our previous tutorial we learned to use convolution to operate on images. One problem that naturally arises is how to handle the boundaries. How can we convolve them if the evaluated points are at the edge of the image?</li>
<li>What most of OpenCV functions do is to copy a given image onto another slightly larger image and then automatically pads the boundary (by any of the methods explained in the sample code just below). This way, the convolution can be performed over the needed pixels without problems (the extra padding is cut after the operation is done).</li>
<li><p class="startli">In this tutorial, we will briefly explore two ways of defining the extra padding (border) for an image:</p><ol type="a">
<li><b>BORDER_CONSTANT</b>: Pad the image with a constant value (i.e. black or \(0\)</li>
<li><b>BORDER_REPLICATE</b>: The row or column at the very edge of the original is replicated to the extra border.</li>
</ol>
<p class="startli">This will be seen more clearly in the Code section.</p>
</li>
</ol>
<ul>
<li><b>What does this program do?</b><ul>
<li>Load an image</li>
<li><p class="startli">Let the user choose what kind of padding use in the input image. There are two options:</p><ol type="1">
<li><em>Constant value border</em>: Applies a padding of a constant value for the whole border. This value will be updated randomly each 0.5 seconds.</li>
<li><em>Replicated border</em>: The border will be replicated from the pixel values at the edges of the original image.</li>
</ol>
<p class="startli">The user chooses either option by pressing 'c' (constant) or 'r' (replicate)</p>
</li>
<li>The program finishes when the user presses 'ESC'</li>
</ul>
</li>
</ul>
<h2>Code </h2>
<p>The tutorial code's is shown lines below.</p>
 <div class='newInnerHTML' title='cpp' style='display: none;'>C++</div><div class='toggleable_div label_cpp' style='display: none;'><p> You can also download it from <a href="https://raw.githubusercontent.com/opencv/opencv/master/samples/cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp">here</a> </p><div class="fragment"><div class="line"></div><div class="line"><span class="preprocessor">#include &quot;<a class="code" href="../../d1/d4f/imgproc_2include_2opencv2_2imgproc_8hpp.html">opencv2/imgproc.hpp</a>&quot;</span></div><div class="line"><span class="preprocessor">#include &quot;<a class="code" href="../../d6/d87/imgcodecs_8hpp.html">opencv2/imgcodecs.hpp</a>&quot;</span></div><div class="line"><span class="preprocessor">#include &quot;<a class="code" href="../../d4/dd5/highgui_8hpp.html">opencv2/highgui.hpp</a>&quot;</span></div><div class="line"></div><div class="line"><span class="keyword">using namespace </span><a class="code" href="../../d2/d75/namespacecv.html">cv</a>;</div><div class="line"></div><div class="line"><span class="comment">// Declare the variables</span></div><div class="line"><a class="code" href="../../d3/d63/classcv_1_1Mat.html">Mat</a> src, dst;</div><div class="line"><span class="keywordtype">int</span> top, bottom, left, right;</div><div class="line"><span class="keywordtype">int</span> borderType = <a class="code" href="../../d2/de8/group__core__array.html#gga209f2f4869e304c82d07739337eae7c5aed2e4346047e265c8c5a6d0276dcd838">BORDER_CONSTANT</a>;</div><div class="line"><span class="keyword">const</span> <span class="keywordtype">char</span>* window_name = <span class="stringliteral">&quot;copyMakeBorder Demo&quot;</span>;</div><div class="line"><a class="code" href="../../d1/dd6/classcv_1_1RNG.html">RNG</a> rng(12345);</div><div class="line"></div><div class="line"><span class="keywordtype">int</span> main( <span class="keywordtype">int</span> argc, <span class="keywordtype">char</span>** argv )</div><div class="line">{</div><div class="line">    <span class="keyword">const</span> <span class="keywordtype">char</span>* imageName = argc &gt;=2 ? argv[1] : <span class="stringliteral">&quot;lena.jpg&quot;</span>;</div><div class="line"></div><div class="line">    <span class="comment">// Loads an image</span></div><div class="line">    src = <a class="code" href="../../d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56">imread</a>( <a class="code" href="../../d6/dba/group__core__utils__samples.html#ga3a33b00033b46c698ff6340d95569c13">samples::findFile</a>( imageName ), <a class="code" href="../../d8/d6a/group__imgcodecs__flags.html#gga61d9b0126a3e57d9277ac48327799c80af660544735200cbe942eea09232eb822">IMREAD_COLOR</a> ); <span class="comment">// Load an image</span></div><div class="line"></div><div class="line">    <span class="comment">// Check if image is loaded fine</span></div><div class="line">    <span class="keywordflow">if</span>( src.<a class="code" href="../../d3/d63/classcv_1_1Mat.html#abbec3525a852e77998aba034813fded4">empty</a>()) {</div><div class="line">        printf(<span class="stringliteral">&quot; Error opening image\n&quot;</span>);</div><div class="line">        printf(<span class="stringliteral">&quot; Program Arguments: [image_name -- default lena.jpg] \n&quot;</span>);</div><div class="line">        <span class="keywordflow">return</span> -1;</div><div class="line">    }</div><div class="line"></div><div class="line">    <span class="comment">// Brief how-to for this program</span></div><div class="line">    printf( <span class="stringliteral">&quot;\n \t copyMakeBorder Demo: \n&quot;</span> );</div><div class="line">    printf( <span class="stringliteral">&quot;\t -------------------- \n&quot;</span> );</div><div class="line">    printf( <span class="stringliteral">&quot; ** Press &#39;c&#39; to set the border to a random constant value \n&quot;</span>);</div><div class="line">    printf( <span class="stringliteral">&quot; ** Press &#39;r&#39; to set the border to be replicated \n&quot;</span>);</div><div class="line">    printf( <span class="stringliteral">&quot; ** Press &#39;ESC&#39; to exit the program \n&quot;</span>);</div><div class="line"></div><div class="line">    <a class="code" href="../../d7/dfc/group__highgui.html#ga5afdf8410934fd099df85c75b2e0888b">namedWindow</a>( window_name, <a class="code" href="../../d0/d90/group__highgui__window__flags.html#ggabf7d2c5625bc59ac130287f925557ac3acf621ace7a54954cbac01df27e47228f">WINDOW_AUTOSIZE</a> );</div><div class="line"></div><div class="line">    <span class="comment">// Initialize arguments for the filter</span></div><div class="line">    top = (int) (0.05*src.<a class="code" href="../../d3/d63/classcv_1_1Mat.html#abed816466c45234254d25bc59c31245e">rows</a>); bottom = top;</div><div class="line">    left = (int) (0.05*src.<a class="code" href="../../d3/d63/classcv_1_1Mat.html#aa3e5a47585c9ef6a0842556739155e3e">cols</a>); right = left;</div><div class="line"></div><div class="line">    <span class="keywordflow">for</span>(;;)</div><div class="line">    {</div><div class="line">        <a class="code" href="../../d1/da0/classcv_1_1Scalar__.html">Scalar</a> value( rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255) );</div><div class="line"></div><div class="line">        <a class="code" href="../../d2/de8/group__core__array.html#ga2ac1049c2c3dd25c2b41bffe17658a36">copyMakeBorder</a>( src, dst, top, bottom, left, right, borderType, value );</div><div class="line"></div><div class="line">        <a class="code" href="../../d7/dfc/group__highgui.html#ga453d42fe4cb60e5723281a89973ee563">imshow</a>( window_name, dst );</div><div class="line"></div><div class="line">        <span class="keywordtype">char</span> c = (char)<a class="code" href="../../d7/dfc/group__highgui.html#ga5628525ad33f52eab17feebcfba38bd7">waitKey</a>(500);</div><div class="line">        <span class="keywordflow">if</span>( c == 27 )</div><div class="line">        { <span class="keywordflow">break</span>; }</div><div class="line">        <span class="keywordflow">else</span> <span class="keywordflow">if</span>( c == <span class="charliteral">&#39;c&#39;</span> )</div><div class="line">        { borderType = <a class="code" href="../../d2/de8/group__core__array.html#gga209f2f4869e304c82d07739337eae7c5aed2e4346047e265c8c5a6d0276dcd838">BORDER_CONSTANT</a>; }</div><div class="line">        <span class="keywordflow">else</span> <span class="keywordflow">if</span>( c == <span class="charliteral">&#39;r&#39;</span> )</div><div class="line">        { borderType = <a class="code" href="../../d2/de8/group__core__array.html#gga209f2f4869e304c82d07739337eae7c5aa1de4cff95e3377d6d0cbe7569bd4e9f">BORDER_REPLICATE</a>; }</div><div class="line">    }</div><div class="line"></div><div class="line">    <span class="keywordflow">return</span> 0;</div><div class="line">}</div></div><!-- fragment -->  </div>  <div class='newInnerHTML' title='java' style='display: none;'>Java</div><div class='toggleable_div label_java' style='display: none;'><p> You can also download it from <a href="https://raw.githubusercontent.com/opencv/opencv/master/samples/java/tutorial_code/ImgTrans/MakeBorder/CopyMakeBorder.java">here</a> </p><div class="fragment"><div class="line"></div><div class="line"><span class="keyword">import</span> org.opencv.core.*;</div><div class="line"><span class="keyword">import</span> org.opencv.highgui.HighGui;</div><div class="line"><span class="keyword">import</span> org.opencv.imgcodecs.Imgcodecs;</div><div class="line"></div><div class="line"><span class="keyword">import</span> java.util.Random;</div><div class="line"></div><div class="line"><span class="keyword">class </span>CopyMakeBorderRun {</div><div class="line"></div><div class="line">    <span class="keyword">public</span> <span class="keywordtype">void</span> run(<a class="code" href="../../dc/d84/group__core__basic.html#ga1f6634802eeadfd7245bc75cf3e216c2">String</a>[] args) {</div><div class="line"></div><div class="line">        <span class="comment">// Declare the variables</span></div><div class="line">        Mat src, dst = <span class="keyword">new</span> Mat();</div><div class="line">        <span class="keywordtype">int</span> top, bottom, left, right;</div><div class="line">        <span class="keywordtype">int</span> borderType = Core.BORDER_CONSTANT;</div><div class="line">        <a class="code" href="../../dc/d84/group__core__basic.html#ga1f6634802eeadfd7245bc75cf3e216c2">String</a> window_name = <span class="stringliteral">&quot;copyMakeBorder Demo&quot;</span>;</div><div class="line">        Random rng;</div><div class="line"></div><div class="line">        <a class="code" href="../../dc/d84/group__core__basic.html#ga1f6634802eeadfd7245bc75cf3e216c2">String</a> imageName = ((args.length &gt; 0) ? args[0] : <span class="stringliteral">&quot;../data/lena.jpg&quot;</span>);</div><div class="line"></div><div class="line">        <span class="comment">// Load an image</span></div><div class="line">        src = Imgcodecs.imread(imageName, Imgcodecs.IMREAD_COLOR);</div><div class="line"></div><div class="line">        <span class="comment">// Check if image is loaded fine</span></div><div class="line">        <span class="keywordflow">if</span>( src.empty() ) {</div><div class="line">            System.out.println(<span class="stringliteral">&quot;Error opening image!&quot;</span>);</div><div class="line">            System.out.println(<span class="stringliteral">&quot;Program Arguments: [image_name -- default ../data/lena.jpg] \n&quot;</span>);</div><div class="line">            System.exit(-1);</div><div class="line">        }</div><div class="line"></div><div class="line">        <span class="comment">// Brief how-to for this program</span></div><div class="line">        System.out.println(<span class="stringliteral">&quot;\n&quot;</span> +</div><div class="line">                <span class="stringliteral">&quot;\t copyMakeBorder Demo: \n&quot;</span> +</div><div class="line">                <span class="stringliteral">&quot;\t -------------------- \n&quot;</span> +</div><div class="line">                <span class="stringliteral">&quot; ** Press &#39;c&#39; to set the border to a random constant value \n&quot;</span> +</div><div class="line">                <span class="stringliteral">&quot; ** Press &#39;r&#39; to set the border to be replicated \n&quot;</span> +</div><div class="line">                <span class="stringliteral">&quot; ** Press &#39;ESC&#39; to exit the program \n&quot;</span>);</div><div class="line"></div><div class="line">        HighGui.namedWindow( window_name, HighGui.WINDOW_AUTOSIZE );</div><div class="line"></div><div class="line">        <span class="comment">// Initialize arguments for the filter</span></div><div class="line">        top = (int) (0.05*src.rows()); bottom = top;</div><div class="line">        left = (int) (0.05*src.cols()); right = left;</div><div class="line"></div><div class="line">        <span class="keywordflow">while</span>( <span class="keyword">true</span> ) {</div><div class="line">            rng = <span class="keyword">new</span> Random();</div><div class="line">            <a class="code" href="../../dc/d84/group__core__basic.html#ga599fe92e910c027be274233eccad7beb">Scalar</a> value = <span class="keyword">new</span> <a class="code" href="../../dc/d84/group__core__basic.html#ga599fe92e910c027be274233eccad7beb">Scalar</a>( rng.nextInt(256),</div><div class="line">                    rng.nextInt(256), rng.nextInt(256) );</div><div class="line"></div><div class="line">            Core.copyMakeBorder( src, dst, top, bottom, left, right, borderType, value);</div><div class="line">            HighGui.imshow( window_name, dst );</div><div class="line"></div><div class="line">            <span class="keywordtype">char</span> c = (char) HighGui.waitKey(500);</div><div class="line">            c = Character.toLowerCase(c);</div><div class="line"></div><div class="line">            <span class="keywordflow">if</span>( c == 27 )</div><div class="line">            { <span class="keywordflow">break</span>; }</div><div class="line">            <span class="keywordflow">else</span> <span class="keywordflow">if</span>( c == <span class="charliteral">&#39;c&#39;</span> )</div><div class="line">            { borderType = Core.BORDER_CONSTANT;}</div><div class="line">            <span class="keywordflow">else</span> <span class="keywordflow">if</span>( c == <span class="charliteral">&#39;r&#39;</span> )</div><div class="line">            { borderType = Core.BORDER_REPLICATE;}</div><div class="line">        }</div><div class="line"></div><div class="line">        System.exit(0);</div><div class="line">    }</div><div class="line">}</div><div class="line"></div><div class="line"><span class="keyword">public</span> <span class="keyword">class </span>CopyMakeBorder {</div><div class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keywordtype">void</span> main(<a class="code" href="../../dc/d84/group__core__basic.html#ga1f6634802eeadfd7245bc75cf3e216c2">String</a>[] args) {</div><div class="line">        <span class="comment">// Load the native library.</span></div><div class="line">        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);</div><div class="line">        <span class="keyword">new</span> CopyMakeBorderRun().run(args);</div><div class="line">    }</div><div class="line">}</div></div><!-- fragment -->  </div>  <div class='newInnerHTML' title='python' style='display: none;'>Python</div><div class='toggleable_div label_python' style='display: none;'><p> You can also download it from <a href="https://raw.githubusercontent.com/opencv/opencv/master/samples/python/tutorial_code/ImgTrans/MakeBorder/copy_make_border.py">here</a> </p><div class="fragment"><div class="line"><span class="stringliteral">&quot;&quot;&quot;</span></div><div class="line"><span class="stringliteral">@file copy_make_border.py</span></div><div class="line"><span class="stringliteral">@brief Sample code that shows the functionality of copyMakeBorder</span></div><div class="line"><span class="stringliteral">&quot;&quot;&quot;</span></div><div class="line"><span class="keyword">import</span> sys</div><div class="line"><span class="keyword">from</span> random <span class="keyword">import</span> randint</div><div class="line"><span class="keyword">import</span> cv2 <span class="keyword">as</span> cv</div><div class="line"></div><div class="line"></div><div class="line"><span class="keyword">def </span>main(argv):</div><div class="line">    </div><div class="line">    borderType = cv.BORDER_CONSTANT</div><div class="line">    window_name = <span class="stringliteral">&quot;copyMakeBorder Demo&quot;</span></div><div class="line">    </div><div class="line">    imageName = argv[0] <span class="keywordflow">if</span> len(argv) &gt; 0 <span class="keywordflow">else</span> <span class="stringliteral">&#39;lena.jpg&#39;</span></div><div class="line"></div><div class="line">    <span class="comment"># Loads an image</span></div><div class="line">    src = <a class="code" href="../../d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56">cv.imread</a>(<a class="code" href="../../d6/dba/group__core__utils__samples.html#ga3a33b00033b46c698ff6340d95569c13">cv.samples.findFile</a>(imageName), cv.IMREAD_COLOR)</div><div class="line"></div><div class="line">    <span class="comment"># Check if image is loaded fine</span></div><div class="line">    <span class="keywordflow">if</span> src <span class="keywordflow">is</span> <span class="keywordtype">None</span>:</div><div class="line">        <span class="keywordflow">print</span> (<span class="stringliteral">&#39;Error opening image!&#39;</span>)</div><div class="line">        <span class="keywordflow">print</span> (<span class="stringliteral">&#39;Usage: copy_make_border.py [image_name -- default lena.jpg] \n&#39;</span>)</div><div class="line">        <span class="keywordflow">return</span> -1</div><div class="line">    </div><div class="line">    <span class="keywordflow">print</span> (<span class="stringliteral">&#39;\n&#39;</span></div><div class="line">           <span class="stringliteral">&#39;\t   copyMakeBorder Demo: \n&#39;</span></div><div class="line">           <span class="stringliteral">&#39;     -------------------- \n&#39;</span></div><div class="line">           <span class="stringliteral">&#39; ** Press \&#39;c\&#39; to set the border to a random constant value \n&#39;</span></div><div class="line">           <span class="stringliteral">&#39; ** Press \&#39;r\&#39; to set the border to be replicated \n&#39;</span></div><div class="line">           <span class="stringliteral">&#39; ** Press \&#39;ESC\&#39; to exit the program &#39;</span>)</div><div class="line">    </div><div class="line">    <a class="code" href="../../d7/dfc/group__highgui.html#ga5afdf8410934fd099df85c75b2e0888b">cv.namedWindow</a>(window_name, cv.WINDOW_AUTOSIZE)</div><div class="line">    </div><div class="line">    top = int(0.05 * src.shape[0])  <span class="comment"># shape[0] = rows</span></div><div class="line">    bottom = top</div><div class="line">    left = int(0.05 * src.shape[1])  <span class="comment"># shape[1] = cols</span></div><div class="line">    right = left</div><div class="line">    </div><div class="line">    <span class="keywordflow">while</span> 1:</div><div class="line">        </div><div class="line">        value = [randint(0, 255), randint(0, 255), randint(0, 255)]</div><div class="line">        </div><div class="line">        dst = <a class="code" href="../../d2/de8/group__core__array.html#ga2ac1049c2c3dd25c2b41bffe17658a36">cv.copyMakeBorder</a>(src, top, bottom, left, right, borderType, <span class="keywordtype">None</span>, value)</div><div class="line">        </div><div class="line">        <a class="code" href="../../df/d24/group__highgui__opengl.html#gaae7e90aa3415c68dba22a5ff2cefc25d">cv.imshow</a>(window_name, dst)</div><div class="line">        </div><div class="line">        c = <a class="code" href="../../d7/dfc/group__highgui.html#ga5628525ad33f52eab17feebcfba38bd7">cv.waitKey</a>(500)</div><div class="line"></div><div class="line">        <span class="keywordflow">if</span> c == 27:</div><div class="line">            <span class="keywordflow">break</span></div><div class="line">        <span class="keywordflow">elif</span> c == 99: <span class="comment"># 99 = ord(&#39;c&#39;)</span></div><div class="line">            borderType = cv.BORDER_CONSTANT</div><div class="line">        <span class="keywordflow">elif</span> c == 114: <span class="comment"># 114 = ord(&#39;r&#39;)</span></div><div class="line">            borderType = cv.BORDER_REPLICATE</div><div class="line">        </div><div class="line">    <span class="keywordflow">return</span> 0</div><div class="line"></div><div class="line"></div><div class="line"><span class="keywordflow">if</span> __name__ == <span class="stringliteral">&quot;__main__&quot;</span>:</div><div class="line">    main(sys.argv[1:])</div></div><!-- fragment -->  </div> <h2>Explanation </h2>
<h4>Declare the variables</h4>
<p>First we declare the variables we are going to use:</p>
 <div class='newInnerHTML' title='cpp' style='display: none;'>C++</div><div class='toggleable_div label_cpp' style='display: none;'> <div class="fragment"><div class="line"><span class="comment">// Declare the variables</span></div><div class="line">Mat src, dst;</div><div class="line"><span class="keywordtype">int</span> top, bottom, left, right;</div><div class="line"><span class="keywordtype">int</span> borderType = <a class="code" href="../../d2/de8/group__core__array.html#gga209f2f4869e304c82d07739337eae7c5aed2e4346047e265c8c5a6d0276dcd838">BORDER_CONSTANT</a>;</div><div class="line"><span class="keyword">const</span> <span class="keywordtype">char</span>* window_name = <span class="stringliteral">&quot;copyMakeBorder Demo&quot;</span>;</div><div class="line">RNG rng(12345);</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='java' style='display: none;'>Java</div><div class='toggleable_div label_java' style='display: none;'> <div class="fragment"><div class="line">        <span class="comment">// Declare the variables</span></div><div class="line">        Mat src, dst = <span class="keyword">new</span> Mat();</div><div class="line">        <span class="keywordtype">int</span> top, bottom, left, right;</div><div class="line">        <span class="keywordtype">int</span> borderType = Core.BORDER_CONSTANT;</div><div class="line">        <a class="code" href="../../dc/d84/group__core__basic.html#ga1f6634802eeadfd7245bc75cf3e216c2">String</a> window_name = <span class="stringliteral">&quot;copyMakeBorder Demo&quot;</span>;</div><div class="line">        Random rng;</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='python' style='display: none;'>Python</div><div class='toggleable_div label_python' style='display: none;'> <div class="fragment"><div class="line">    <span class="comment"># First we declare the variables we are going to use</span></div><div class="line">    borderType = cv.BORDER_CONSTANT</div><div class="line">    window_name = <span class="stringliteral">&quot;copyMakeBorder Demo&quot;</span></div></div><!-- fragment --> </div> <p>Especial attention deserves the variable <em>rng</em> which is a random number generator. We use it to generate the random border color, as we will see soon.</p>
<h4>Load an image</h4>
<p>As usual we load our source image <em>src</em>:</p>
 <div class='newInnerHTML' title='cpp' style='display: none;'>C++</div><div class='toggleable_div label_cpp' style='display: none;'> <div class="fragment"><div class="line">    <span class="keyword">const</span> <span class="keywordtype">char</span>* imageName = argc &gt;=2 ? argv[1] : <span class="stringliteral">&quot;lena.jpg&quot;</span>;</div><div class="line"></div><div class="line">    <span class="comment">// Loads an image</span></div><div class="line">    src = <a class="code" href="../../d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56">imread</a>( <a class="code" href="../../d6/dba/group__core__utils__samples.html#ga3a33b00033b46c698ff6340d95569c13">samples::findFile</a>( imageName ), <a class="code" href="../../d8/d6a/group__imgcodecs__flags.html#gga61d9b0126a3e57d9277ac48327799c80af660544735200cbe942eea09232eb822">IMREAD_COLOR</a> ); <span class="comment">// Load an image</span></div><div class="line"></div><div class="line">    <span class="comment">// Check if image is loaded fine</span></div><div class="line">    <span class="keywordflow">if</span>( src.empty()) {</div><div class="line">        printf(<span class="stringliteral">&quot; Error opening image\n&quot;</span>);</div><div class="line">        printf(<span class="stringliteral">&quot; Program Arguments: [image_name -- default lena.jpg] \n&quot;</span>);</div><div class="line">        <span class="keywordflow">return</span> -1;</div><div class="line">    }</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='java' style='display: none;'>Java</div><div class='toggleable_div label_java' style='display: none;'> <div class="fragment"><div class="line">        <a class="code" href="../../dc/d84/group__core__basic.html#ga1f6634802eeadfd7245bc75cf3e216c2">String</a> imageName = ((args.length &gt; 0) ? args[0] : <span class="stringliteral">&quot;../data/lena.jpg&quot;</span>);</div><div class="line"></div><div class="line">        <span class="comment">// Load an image</span></div><div class="line">        src = Imgcodecs.imread(imageName, Imgcodecs.IMREAD_COLOR);</div><div class="line"></div><div class="line">        <span class="comment">// Check if image is loaded fine</span></div><div class="line">        <span class="keywordflow">if</span>( src.empty() ) {</div><div class="line">            System.out.println(<span class="stringliteral">&quot;Error opening image!&quot;</span>);</div><div class="line">            System.out.println(<span class="stringliteral">&quot;Program Arguments: [image_name -- default ../data/lena.jpg] \n&quot;</span>);</div><div class="line">            System.exit(-1);</div><div class="line">        }</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='python' style='display: none;'>Python</div><div class='toggleable_div label_python' style='display: none;'> <div class="fragment"><div class="line">    imageName = argv[0] <span class="keywordflow">if</span> len(argv) &gt; 0 <span class="keywordflow">else</span> <span class="stringliteral">&#39;lena.jpg&#39;</span></div><div class="line"></div><div class="line">    <span class="comment"># Loads an image</span></div><div class="line">    src = <a class="code" href="../../d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56">cv.imread</a>(<a class="code" href="../../d6/dba/group__core__utils__samples.html#ga3a33b00033b46c698ff6340d95569c13">cv.samples.findFile</a>(imageName), cv.IMREAD_COLOR)</div><div class="line"></div><div class="line">    <span class="comment"># Check if image is loaded fine</span></div><div class="line">    <span class="keywordflow">if</span> src <span class="keywordflow">is</span> <span class="keywordtype">None</span>:</div><div class="line">        <span class="keywordflow">print</span> (<span class="stringliteral">&#39;Error opening image!&#39;</span>)</div><div class="line">        <span class="keywordflow">print</span> (<span class="stringliteral">&#39;Usage: copy_make_border.py [image_name -- default lena.jpg] \n&#39;</span>)</div><div class="line">        <span class="keywordflow">return</span> -1</div></div><!-- fragment --> </div> <h4>Create a window</h4>
<p>After giving a short intro of how to use the program, we create a window:</p>
 <div class='newInnerHTML' title='cpp' style='display: none;'>C++</div><div class='toggleable_div label_cpp' style='display: none;'> <div class="fragment"><div class="line">    <a class="code" href="../../d7/dfc/group__highgui.html#ga5afdf8410934fd099df85c75b2e0888b">namedWindow</a>( window_name, <a class="code" href="../../d0/d90/group__highgui__window__flags.html#ggabf7d2c5625bc59ac130287f925557ac3acf621ace7a54954cbac01df27e47228f">WINDOW_AUTOSIZE</a> );</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='java' style='display: none;'>Java</div><div class='toggleable_div label_java' style='display: none;'> <div class="fragment"><div class="line">        HighGui.namedWindow( window_name, HighGui.WINDOW_AUTOSIZE );</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='python' style='display: none;'>Python</div><div class='toggleable_div label_python' style='display: none;'> <div class="fragment"><div class="line">    <a class="code" href="../../d7/dfc/group__highgui.html#ga5afdf8410934fd099df85c75b2e0888b">cv.namedWindow</a>(window_name, cv.WINDOW_AUTOSIZE)</div></div><!-- fragment --> </div> <h4>Initialize arguments</h4>
<p>Now we initialize the argument that defines the size of the borders (<em>top</em>, <em>bottom</em>, <em>left</em> and <em>right</em>). We give them a value of 5% the size of <em>src</em>.</p>
 <div class='newInnerHTML' title='cpp' style='display: none;'>C++</div><div class='toggleable_div label_cpp' style='display: none;'> <div class="fragment"><div class="line">    <span class="comment">// Initialize arguments for the filter</span></div><div class="line">    top = (int) (0.05*src.rows); bottom = top;</div><div class="line">    left = (int) (0.05*src.cols); right = left;</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='java' style='display: none;'>Java</div><div class='toggleable_div label_java' style='display: none;'> <div class="fragment"><div class="line">        <span class="comment">// Initialize arguments for the filter</span></div><div class="line">        top = (int) (0.05*src.rows()); bottom = top;</div><div class="line">        left = (int) (0.05*src.cols()); right = left;</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='python' style='display: none;'>Python</div><div class='toggleable_div label_python' style='display: none;'> <div class="fragment"><div class="line">    <span class="comment"># Initialize arguments for the filter</span></div><div class="line">    top = int(0.05 * src.shape[0])  <span class="comment"># shape[0] = rows</span></div><div class="line">    bottom = top</div><div class="line">    left = int(0.05 * src.shape[1])  <span class="comment"># shape[1] = cols</span></div><div class="line">    right = left</div></div><!-- fragment --> </div> <h4>Loop</h4>
<p>The program runs in an infinite loop while the key <b>ESC</b> isn't pressed. If the user presses '<b>c</b>' or '<b>r</b>', the <em>borderType</em> variable takes the value of <em>BORDER_CONSTANT</em> or <em>BORDER_REPLICATE</em> respectively:</p>
 <div class='newInnerHTML' title='cpp' style='display: none;'>C++</div><div class='toggleable_div label_cpp' style='display: none;'> <div class="fragment"><div class="line">        <span class="keywordtype">char</span> c = (char)<a class="code" href="../../d7/dfc/group__highgui.html#ga5628525ad33f52eab17feebcfba38bd7">waitKey</a>(500);</div><div class="line">        <span class="keywordflow">if</span>( c == 27 )</div><div class="line">        { <span class="keywordflow">break</span>; }</div><div class="line">        <span class="keywordflow">else</span> <span class="keywordflow">if</span>( c == <span class="charliteral">&#39;c&#39;</span> )</div><div class="line">        { borderType = <a class="code" href="../../d2/de8/group__core__array.html#gga209f2f4869e304c82d07739337eae7c5aed2e4346047e265c8c5a6d0276dcd838">BORDER_CONSTANT</a>; }</div><div class="line">        <span class="keywordflow">else</span> <span class="keywordflow">if</span>( c == <span class="charliteral">&#39;r&#39;</span> )</div><div class="line">        { borderType = <a class="code" href="../../d2/de8/group__core__array.html#gga209f2f4869e304c82d07739337eae7c5aa1de4cff95e3377d6d0cbe7569bd4e9f">BORDER_REPLICATE</a>; }</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='java' style='display: none;'>Java</div><div class='toggleable_div label_java' style='display: none;'> <div class="fragment"><div class="line">            <span class="keywordtype">char</span> c = (char) HighGui.waitKey(500);</div><div class="line">            c = Character.toLowerCase(c);</div><div class="line"></div><div class="line">            <span class="keywordflow">if</span>( c == 27 )</div><div class="line">            { <span class="keywordflow">break</span>; }</div><div class="line">            <span class="keywordflow">else</span> <span class="keywordflow">if</span>( c == <span class="charliteral">&#39;c&#39;</span> )</div><div class="line">            { borderType = Core.BORDER_CONSTANT;}</div><div class="line">            <span class="keywordflow">else</span> <span class="keywordflow">if</span>( c == <span class="charliteral">&#39;r&#39;</span> )</div><div class="line">            { borderType = Core.BORDER_REPLICATE;}</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='python' style='display: none;'>Python</div><div class='toggleable_div label_python' style='display: none;'> <div class="fragment"><div class="line">        c = <a class="code" href="../../d7/dfc/group__highgui.html#ga5628525ad33f52eab17feebcfba38bd7">cv.waitKey</a>(500)</div><div class="line"></div><div class="line">        <span class="keywordflow">if</span> c == 27:</div><div class="line">            <span class="keywordflow">break</span></div><div class="line">        <span class="keywordflow">elif</span> c == 99: <span class="comment"># 99 = ord(&#39;c&#39;)</span></div><div class="line">            borderType = cv.BORDER_CONSTANT</div><div class="line">        <span class="keywordflow">elif</span> c == 114: <span class="comment"># 114 = ord(&#39;r&#39;)</span></div><div class="line">            borderType = cv.BORDER_REPLICATE</div></div><!-- fragment --> </div> <h4>Random color</h4>
<p>In each iteration (after 0.5 seconds), the random border color (<em>value</em>) is updated...</p>
 <div class='newInnerHTML' title='cpp' style='display: none;'>C++</div><div class='toggleable_div label_cpp' style='display: none;'> <div class="fragment"><div class="line">        <a class="code" href="../../dc/d84/group__core__basic.html#ga599fe92e910c027be274233eccad7beb">Scalar</a> value( rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255) );</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='java' style='display: none;'>Java</div><div class='toggleable_div label_java' style='display: none;'> <div class="fragment"><div class="line">            rng = <span class="keyword">new</span> Random();</div><div class="line">            <a class="code" href="../../dc/d84/group__core__basic.html#ga599fe92e910c027be274233eccad7beb">Scalar</a> value = <span class="keyword">new</span> <a class="code" href="../../dc/d84/group__core__basic.html#ga599fe92e910c027be274233eccad7beb">Scalar</a>( rng.nextInt(256),</div><div class="line">                    rng.nextInt(256), rng.nextInt(256) );</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='python' style='display: none;'>Python</div><div class='toggleable_div label_python' style='display: none;'> <div class="fragment"><div class="line">        value = [randint(0, 255), randint(0, 255), randint(0, 255)]</div></div><!-- fragment --> </div> <p>This value is a set of three numbers picked randomly in the range \([0,255]\).</p>
<h4>Form a border around the image</h4>
<p>Finally, we call the function <b><a class="el" href="../../d2/de8/group__core__array.html#ga2ac1049c2c3dd25c2b41bffe17658a36" title="Forms a border around an image. ">copyMakeBorder()</a></b> to apply the respective padding:</p>
 <div class='newInnerHTML' title='cpp' style='display: none;'>C++</div><div class='toggleable_div label_cpp' style='display: none;'> <div class="fragment"><div class="line">        <a class="code" href="../../d2/de8/group__core__array.html#ga2ac1049c2c3dd25c2b41bffe17658a36">copyMakeBorder</a>( src, dst, top, bottom, left, right, borderType, value );</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='java' style='display: none;'>Java</div><div class='toggleable_div label_java' style='display: none;'> <div class="fragment"><div class="line">            Core.copyMakeBorder( src, dst, top, bottom, left, right, borderType, value);</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='python' style='display: none;'>Python</div><div class='toggleable_div label_python' style='display: none;'> <div class="fragment"><div class="line">        dst = <a class="code" href="../../d2/de8/group__core__array.html#ga2ac1049c2c3dd25c2b41bffe17658a36">cv.copyMakeBorder</a>(src, top, bottom, left, right, borderType, <span class="keywordtype">None</span>, value)</div></div><!-- fragment --> </div> <ul>
<li>The arguments are:<ol type="1">
<li><em>src</em>: Source image</li>
<li><em>dst</em>: Destination image</li>
<li><em>top</em>, <em>bottom</em>, <em>left</em>, <em>right</em>: Length in pixels of the borders at each side of the image. We define them as being 5% of the original size of the image.</li>
<li><em>borderType</em>: Define what type of border is applied. It can be constant or replicate for this example.</li>
<li><em>value</em>: If <em>borderType</em> is <em>BORDER_CONSTANT</em>, this is the value used to fill the border pixels.</li>
</ol>
</li>
</ul>
<h4>Display the results</h4>
<p>We display our output image in the image created previously</p>
 <div class='newInnerHTML' title='cpp' style='display: none;'>C++</div><div class='toggleable_div label_cpp' style='display: none;'> <div class="fragment"><div class="line">        <a class="code" href="../../d7/dfc/group__highgui.html#ga453d42fe4cb60e5723281a89973ee563">imshow</a>( window_name, dst );</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='java' style='display: none;'>Java</div><div class='toggleable_div label_java' style='display: none;'> <div class="fragment"><div class="line">            HighGui.imshow( window_name, dst );</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='python' style='display: none;'>Python</div><div class='toggleable_div label_python' style='display: none;'> <div class="fragment"><div class="line">        <a class="code" href="../../df/d24/group__highgui__opengl.html#gaae7e90aa3415c68dba22a5ff2cefc25d">cv.imshow</a>(window_name, dst)</div></div><!-- fragment --> </div> <h2>Results </h2>
<ol type="1">
<li><p class="startli">After compiling the code above, you can execute it giving as argument the path of an image. The result should be:</p><ul>
<li>By default, it begins with the border set to BORDER_CONSTANT. Hence, a succession of random colored borders will be shown.</li>
<li>If you press 'r', the border will become a replica of the edge pixels.</li>
<li>If you press 'c', the random colored borders will appear again</li>
<li>If you press 'ESC' the program will exit.</li>
</ul>
<p class="startli">Below some screenshot showing how the border changes color and how the <em>BORDER_REPLICATE</em> option looks:</p>
<div class="image">
<img src="../../CopyMakeBorder_Tutorial_Results.jpg" alt="CopyMakeBorder_Tutorial_Results.jpg"/>
</div>
 </li>
</ol>
</div></div><!-- contents -->
<!-- HTML footer for doxygen 1.8.6-->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Apr 2 2021 11:36:35 for OpenCV by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="../../doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
<script type="text/javascript">
//<![CDATA[
addTutorialsButtons();
//]]>
</script>
</body>
</html>
